package com.cheng.example.book.advise151.chap5;

import java.util.Arrays;
import java.util.List;

/**
 * 建议60：性能考虑，数组是首选
 * <p>
 * 对基本类型进行求和运算时，数组的效率是集合的10倍。
 * <p>
 * 性能要求较高的场景中使用数组代替集合
 * <p>
 * 注意看sum += datas.get(i);这行代码，这里其实已经做了一个拆箱动作，Integer对象通过intValue方法自动转换成了一个int基本类型，
 * 对于性能濒于临界的系统来说该方案是比较危险的，特别是大数量的时候，首先，在初始化List数组时要进行装箱操作，把一个int类型包装成一个Integer对象，
 * 虽然有整型池在，但不在整型池范围内的都会产生一个新的Integer对象，而且众所周知，基本类型是在栈内存中操作的，而对象是堆内存中操作的，
 * 栈内存的特点是：速度快，容量小；堆内存的特点是：速度慢，容量大（从性能上讲，基本类型的处理占优势）。
 * 其次，在进行求和运算时(或者其它遍历计算)时要做拆箱动作，因此无谓的性能消耗也就产生了。在实际测试中发现
 */
public class Client60 {
    //对数组求和
    public static long sum(int[] datas) {
        long sum = 0;
        for (int i = 0; i < datas.length; i++) {
            sum += datas[i];
        }
        return sum;
    }

    // 对列表求和计算
    public static long sum(List<Integer> datas) {
        long sum = 0;
        for (int i = 0; i < datas.size(); i++) {
            sum += datas.get(i);
        }
        return sum;
    }


    public static void main(String[] args) {

        Integer datas[] = new Integer[1000 * 10000];

//        int datas[] = new int[1000 * 10000];

        for (int i = 0; i < datas.length; i++) {
            datas[i] = i;
        }
        List<Integer> integerList = Arrays.asList(datas);


        long start = System.currentTimeMillis();
        sum(integerList);
//        sum(datas);
        System.out.println(System.currentTimeMillis() - start);
    }


}


